SQL - Dicas de TSQL para o Microsoft SQL Server

Fato importante sobre a estrutura do MS SQL Server

Se você criar um banco de dados, uma tabela, seja lá o que for você pode definir seu tamanho inicial, o incremento a cada expansão e o tamanho máximo. A menos que você diga ao sistema para não passar do tamanho máximo o sql irá aumentar o objeto além do tamanho máximo se necessário senão o banco de dados em sí poderia travar por falta de recursos. Contudo o MS SQL Server nunca reduz o espaço de seus objetos se tiver muito espaço sobrando. Ele não faz isso porque a compressão dos dados é uma tarefa muito pesada para ser realizada rotineiramente. Seria como um garbagge collector num java ou .NET com a diferença que a compactação nunca é executada e o garbagge collector é realizado sempre que você termina a aplicação.

Você até pode pedir para ele compactar o banco de dados ao fechar o seu acesso mas ninguém faz isso, é muito pesado. Por isso a gente incluí nas rotinas de manutenção a compactação dos bancos (DBCC ShrinkDatabase) e até alguns índices que ficam fragmentados pela grande atualização das tabelas devem ser reconstruídos para poupar recursos do servidor nas pesquisas.

Estrutura do MS SQL Server

Se você instalou o MS SQL Server na sua máquina observou que ele instala automaticamente 4 bancos de dados de controle do sistema necessários para que o SQL possa funcionar. São chamados de 'Bancos de dados do Sistema'. Por via de regra jamais atualize os dados desses bancos de dados porque você poderá danificar o servidor SQL. Abaixo cito sua utilização no sistema.

1-Master : Tem esse nome e não é de bobeira não, é a tabela principal do MS SQL Server. Armazena os dados que permite o funcionamento do SQL server internamente, sobre a estutura do SQL em sí. Por exemplo, se existe replicação automática do banco de dados (como, quando, resultado), toda estrutura de bancos de dados, tabelas, colunas, etc, Informações sobre usuários, etc. Clique na tabela master expanda o nó Exibições do sistema e terá um susto com tantos objetos já instalados.
Abra a aba 'Programação', 'Procedimentos Armazenados', 'Procedimentos Armazenados do sistema' e terá outro susto com o número de procedures definidas por default pelo servidor SQL. Praticamente tudo referente ao conteúdo dentro do servidor SQL server está aqui menos os dados das tabelas.

2 - Model : Como o nome diz, é um modelo e só serve como modelo para criação de um banco de dados no sistema. Sempre que você der um comando create database ou crete table o modelo para criação desses objetos será obtido deste banco de dados.

3 - Msdb : Armazena informmações sobre os processos internos do SQL Server como Log, backups, agendamentos (schedules), email (sysmail), segurança (policies), ou seja, tudo que pertença ao SQL mas não a sua estrutura mas sim ao gerenciamento do seu funcionamento.

4 - tempdb : Este banco de dados é usado para rascunho das atividades do servidor MS SQL Server. Quando você, por exemplo, digita uma querie que tem um order by os dados são transferidos para a tempdb e dentro da tempdb os dados são ordenados. Funções como group by, having usam este banco de dados como rascunho também.

Cuidado : O tempdb é usado como rascunho pelo sistema e por isso, sempre que necessário, é expandido para que caiba os dados nesse banco de dados. Contudo podemos ter ocasião que o servidor pare de funcionar porque o disco está cheio e o sistema não consegue alocar espaço para esta tabela (tempb). Sempre tenha na manga uma querie boa para compactar o tempdb sem perder dados.

Nota : Recomendo colocar a tempdb e a tabela de log em discos separados. Ambos são fundamentais para o funcionamento do servidor SQL Server e, literalmente, o sistema inteiro depende do bom funcionamento destes 2 itens.

SysObjects - View dos objetos do sistema

Esta 'vista'(view) dos objetos do sistema visa permitir aos analistas dos bancos de dados do sistema descobrir o que tem, o que está sendo feito, etc. dentro do sistema gerido pelo MS SQL Server.

Se você executar a querie : select distinct(xtype) from sysobjects order by xtype verá que inicialmente no servidor SQL temos os seguintes tipos de objetos : AF, FN, FS, IF, IT, P, PC, S, SQ, TF, U, V, X mas fique sabendo que tem mais tipos possíveis. Abaixo coloco uma lista estraída de um site da Microsoft.

AF = Função de agregação (CLR)
C = Restrição (constraint) CHECK
D = Padrão ou restrição (constraint) DEFAULT
F = Restrição (constraint) FOREIGN KEY
L = Log de atividades do Servidor SQL
FN = Função escalar - Retorna um tipo scalar como inteiro, long int, varchar(x)
FS = Função escalar de assembly (CLR)
FT = Função avaliada por tabela de assembly (CLR)
IF = Função de tabela em linha
TI = tabela interna
P = Procedimento armazenado - Stored Procedure
PC = assembly (CLR) armazenado-procedimento
PK = Restrição (constraint) PRIMARY KEY (o tipo é K)
RF = Procedimento armazenado de filtro de replicação
S = Tabela do sistema
SN = Sinônimo
SQ = Fila de serviço
TA = Gatilho DML de assembly (CLR)
TF = Função de tabela
TR = gatilho DML do SQL
TT = Tipo de tabela
U = Tabela criada ou definida pelo usuário
UQ = Restrição (constraint) UNIQUE (o tipo é K)
V = Exibição - View
X = Procedimento armazenado estendido

Vamos comentar as mais importantes da view SysObjects :

Comando Efeito
select * from sysobjects where xtype='U' ou exec sp_tables Lista todas as tabelas de Usuário do Banco de dados atual.
select * from sysobjects where xtype='S' Lista todos os objetos de sistema dentro das tabelas do banco de dados atual.
select * from sysobjects where xtype='P' Lista todas as Stored Procedures do banco de dados atual
select * from sysobjects where xtype='X' Exibe todos os índices de todas as tabelas do banco de dados atual
select * from sysobjects where xtype='F' Exibe todas as Chaves estrangeira ( FK ) do banco de dados atual
select * from sysobjects where xtype='PK' Lista todas as Chaves Primárias ( PK ) do banco de dados atual
select * from sysobjects where xtype='UQ' Lista todas as Chaves Unicas do sistema ( Unique Key Constraint )
select * from sysobjects where xtype='TF' Lista as Funções cadastradas no sistema. (*3)
select * from sysobjects where xtype='IF' Lista as Funções cadastradas no sistema.
select * from sysobjects where xtype='V' Lista as views do sistema (*1).
select * from sysobjects where left(name,3)='TBL' Lista os Objetos do sistema que tenham as primeiras letras como 'TBL'(*4).
select * from sysobjects where type='TR' Lista as triggers cadastradas no sistema - MS SQL SRV 2000(*2)

Notas :

(*1) Uma view é uma 'visão' particular de um conjunto de dados. Por exemplo, eu posso numa view agrupar inúmeras tabelas e selecionar colunas específicas de cada uma dessas tabelas e com isto dar uma 'visão' específica da informação requerida. Por exemplo, suponha que você queira exibir as vendas por trimestre de um produto e os dados de vendas estão nas tabelas vendas, clientes, vendasProd,vendasFat. Podemos passar parâmetros para a view e ela executará a pesquisa complexa de uma maneira bem facilitada evitando erros.

(*2) : Um trigger é um processo interno do sql server que é disparado quando ocorre um envento num objeto. Por exemplo, ao atualizar uma tabela desejamos colocar a informação que havia anteriormente na tabela, quem fez a atualização e quando fez a atualização para efeitos de auditoria. Por exemplo, o trigger poderia ser disparado no evento 'before update', ou seja, antes da atualização da tabela e, se o usuário não tiver essa autorização podemos barrar e anotar o problema ocorrido.

(*3) : Uma Função nada mais são que uma sequencia de comandos SQL que executam operações e no final retornam qualquer tipo de dados, pode ser um número, texto, tabela, etc (chamamos de dado escalar). Por exemplo de uma função SQL seria uma função que recebe 2 números e retorna a soma dos mesmos. Note que a função pode acessar tabelas, fazer cálculos, processar seja o que for e voltar um resultado diferentemente da Procedure que só retorna dados de uma tabela ou alguma operação com as colunas das tabelas. Técnicamente, uma função é algo mais complexo que uma procedure não conseguiria obter pois requer mais processamento. Contudo é bem mais simples que um cursor porque não precisa varrer, obrigatóriamente, todos os dados de uma pesquisa para chegar a um resultado.

(*4) : Neste exemplo eu assumi que TBL é um prefixo para tabelas do banco de dados mas poderia ser qualquer outra nome de objeto cadastrado no servidor.